package com.moyuwanjia.jdbcTemplate;

import com.moyuwanjia.Dao.AccountDao;
import com.moyuwanjia.pojo.Account;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * @author 摸鱼丸加~
 * @create 2022-07-17 10:24
 * JdbcTemplate基本使用
 */

public class JdbctemplateDemo01 {
    @Test
    public void test01(){
//  1.这里使用的数据源是不dbutils和c3p0,而是使用spring内置的数据源
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/eesy_mybatis");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
//  2.创建Template对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//  3.或者set方式设置数据源也可以，因为使用构造器的方式也是调用set方法
//        jdbcTemplate.setDataSource(dataSource);
//  4.执行操作
    jdbcTemplate.execute("insert into account02(name ,money) values('ccc',3000)");
    }

    /**
     * 以IOC的方式使用，交由spring来管理jdbcTemplate
     */
    @Test
    public void test02(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        JdbcTemplate jdbcTemplate1 = context.getBean("jdbcTemplate", JdbcTemplate.class);
        jdbcTemplate1.execute("insert into account02(name ,money) values('ddd',3000)");
    }

    /**
     * 以IOC的方式使用，交由spring来管理
     * 使用jdbcTemplate的CRUD操作
     */
    @Test
    public void test03(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        JdbcTemplate jdbcTemplate1 = context.getBean("jdbcTemplate", JdbcTemplate.class);
//        测试增删改
//        jdbcTemplate1.update("insert into account02(name ,money) values('eee',3000)");
//        jdbcTemplate1.update("update account02 set name = ? where id = ?","moyu","2");
//        jdbcTemplate1.update("delete from account02 where id = ?","14");

//        查询一个或者多个,AccountRowMapper()实现类RowMapper，是我们自定义的封装策略，而BeanPropertyRowMapper是spring提供的
        List<Account> query = jdbcTemplate1.query("select * from account02 where money > ?", new AccountRowMapper(), 100F);
        query.forEach(System.out::println);
        List<Account> query1 = jdbcTemplate1.query("select * from account02 where money > ?", new BeanPropertyRowMapper<Account>(Account.class), 100F);
        query1.forEach(System.out::println);

//      查询单行单列
//        int account = jdbcTemplate1.queryForObject("select count(*) from account02 where money >= ?", int.class, 1000);

    }

    /**
     * 测试在Dao中使用Template
     */
    @Test
    public void test04(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        AccountDao accountDao = context.getBean("accountDao02", AccountDao.class);
        Account accountById = accountDao.findAccountById(2);
        System.out.println(accountById);
    }
}
class AccountRowMapper implements RowMapper<Account>{
    /**
     * 定义account的封装策略，把结果集中的数据封装到Account中，
     * 然后由spring把每个Account加到集合中
     * @param resultSet
     * @param i
     * @return
     * @throws SQLException
     */
    public Account mapRow(ResultSet resultSet, int i) throws SQLException {
        Account account = new Account();
        account.setId(resultSet.getInt("id"));
        account.setName(resultSet.getString("name"));
        account.setMoney(resultSet.getFloat("money"));
        return account;
    }
}
